home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / programming / other / tandem / teaching / 56.asm < prev    next >
Assembly Source File  |  1999-09-06  |  5KB  |  162 lines

  1. * 56.asm     TLreqshow with smart search    version 0.01    8.6.99
  2.  
  3.  
  4.  include 'Front.i'
  5.  
  6.  
  7. ; This program demonstrates the use of TLReqshow, which allows the user to
  8. ; view a series of lines, while your program calculates their contents
  9. ; dynamically. It includes a smart search. Sometimes, as here, the calling
  10. ; program knows how to find strings quickly, which saves TLReqshow from
  11. ; looking through the strings one by one, a slow process if there are many
  12. ; strings. In such cases, use smart search.
  13.  
  14. ; TLreqshow is a powerful requester, and though writing a hook is admittedly
  15. ; rather difficult, they can save you a lot of work. See, for example, the
  16. ; TLreqshow that comes up in TLMultiline when you request "Print" from the
  17. ; menu. TLreqshow there saves a lot of coding.
  18.  
  19.  
  20. strings: dc.b 0
  21.  dc.b 'Some strings for your delectation (n.b. press <Help> for info)',0 ;1
  22. st_2: dc.b 'String   ',0 ;2
  23.  dc.b 'You have seen a TLReqshow requester (sigh!)',0 ;3
  24.  dc.b '(press <Help> for more help!)',0 ;4
  25.  dc.b 'Alas! This wonderful TLReqshow demo is finished!',0 ;5
  26.  dc.b '(Wasn''t it great!!! Applause! Applause!)',0 ;6
  27.  dc.b 'This program (i.e. 56.asm) will put up a TLreqshow requester.',0 ;7
  28.  dc.b ' ',0 ;8
  29.  dc.b '56.asm is programmed to do "smart search". So when you press',0 ;9
  30.  dc.b 'any of the "Seek" buttons on the TLReqshow, the search will be',0 ;10
  31.  dc.b 'very fast.',0 ;11
  32.  dc.b 'Error: out of mem',0 ;12
  33.  
  34.  ds.w 0
  35.  
  36. clikd: ds.l 1 ;line selected
  37. maxi: ds.w 1  ;no. of lines
  38.  
  39. * test program
  40. Program:
  41.  TLwindow #-1              ;set things up
  42.  beq Pr_bad1
  43.  
  44.  TLreqinfo #7,#5           ;preliminary info
  45.  
  46.  move.l #100000,maxi       ;set number of lines
  47.  move.l #-1,clikd          ;flag no line is yet clicked
  48.  TLreqshow #Hook,#1,maxi,#17,#0,smart
  49.  beq.s Pr_bad2             ;go if TLreqshow fails
  50.  
  51.  move.w #5,xxp_Help(a4)    ;attach help
  52.  move.w #2,xxp_Help+2(a4)
  53.  TLreqinfo #3,#2           ;final message
  54.  bra.s Pr_quit
  55.  
  56. Pr_bad1:                   ;here if TLwindow failed
  57.  TLbad #12                 ;report to CLI
  58.  bra.s Pr_quit
  59.  
  60. Pr_bad2:                   ;here if TLreqshow failed
  61.  TLerror                   ;report cause of error
  62.  TLreqchoose
  63.  
  64. Pr_quit:
  65.  rts
  66.  
  67.  
  68. * Act as hook for TLReqshow
  69. Hook:
  70.  tst.l d0                  ;go if line clicked
  71.  bmi.s Ho_clkd
  72.  bsr Make                  ;synthesize line d0, point a0 to it
  73.  rts
  74. Ho_clkd:
  75.  btst #30,d0               ;go if smart search
  76.  bne.s Ho_smrt
  77.  cmp.l clikd,d0            ;line already highlighted?
  78.  bne.s Ho_on               ;no, go
  79.  move.l #-1,clikd
  80.  moveq #1,d0               ;highlighting off
  81.  rts
  82. Ho_on:
  83.  move.l d0,clikd           ;remember which line is being highlighted
  84.  moveq #2,d0               ;turn highlighting on
  85.  rts
  86. Ho_smrt:
  87.  and.l #$3FFFFFFF,d0       ;d0 = start from, d1 = 3/4/5 = fore/back/left
  88.  bsr Smart                 ;do a smart search
  89.  rts
  90.  
  91.  
  92. * synthesize line d0
  93. Make:
  94.  TLstrbuf #2               ;string 2 to buffer
  95.  move.l a4,a0
  96.  addq.l #8,a0
  97.  move.l #'    ',(a0)       ;blank num
  98.  TLhexasc d0,a0            ;put num
  99.  clr.b (a0)
  100.  move.l a4,a0              ;point a0 to string as synthesized
  101.  rts
  102.  
  103.  
  104. * do a smart search   D0 = start from,  D1 = 3/4/5 = fore/back/left
  105. Smart:
  106.  move.l d0,d2              ;cache d0 in d2
  107.  move.l a4,a0              ;point a5 to sought
  108.  add.w #xxp_patt,a0
  109.  move.b (a0),d3            ;d3 is the first chr of sought
  110.  beq.s Sm_1                ;(match anything if null string - can't happen?)
  111.  lea st_2,a1
  112. Sm_st2:                    ;see if 1st chr in st_2
  113.  tst.b (a1)
  114.  beq.s Sm_num              ;no, assume all numbers
  115.  cmp.b (a1)+,d3
  116.  bne Sm_st2
  117.  subq.l #1,a1              ;a1 is 1st chr of st_2 that matches sought
  118.  cmp.b #' ',d3
  119.  bne.s Sm_cmp              ;go if not blank
  120.  cmp.b #' ',1(a0)
  121.  beq.s Sm_cmp              ;ok if 2nd chr of sought also blank
  122.  addq.l #1,a1              ;else, match w. 2nd blank of st_2
  123. Sm_cmp:
  124.  cmpm.b (a0)+,(a1)+        ;match each chr of sought w. st_2
  125.  bne.s Sm_no               ;no if mismatch
  126.  tst.b (a0)
  127.  beq.s Sm_1                ;always matches if all match w. st_2
  128.  cmp.b #'0',(a0)
  129.  bcs Sm_cmp                ;stop matching with st_2 if 0-9 found
  130.  cmp.b #'9'+1,(a0)
  131.  bcc Sm_cmp
  132. Sm_num:                    ;seek value of number at a0
  133.  TLaschex a0               ;d0 = value
  134.  tst.b (a0)                ;did all chrs get bypassed?
  135.  bne.s Sm_no               ;no, garbage after number
  136.  cmp.w #4,d1
  137.  bcs.s Sm_fore             ;go if forward
  138.  bne.s Sm_maxi             ;go if left
  139.  cmp.l d2,d0
  140.  bcc.s Sm_no               ;backward: no if d0 not backward
  141. Sm_yes:
  142.  rts
  143. Sm_fore:
  144.  cmp.l d0,d2               ;forward: no if d0 not forward
  145.  bcc.s Sm_no
  146. Sm_maxi:
  147.  cmp.l maxi,d0             ;forward: no if d0 out of range
  148.  bcs Sm_yes
  149. Sm_no:
  150.  moveq #-1,d0              ;d0 = -1 if unfound
  151.  rts
  152. Sm_1:                      ;here if always matches
  153.  moveq #0,d0
  154.  cmp.w #5,d1
  155.  beq Sm_yes                ;string 0 if left
  156.  move.l d2,d0
  157.  addq.l #1,d0
  158.  cmp.w #3,d1               ;string +1 if forward
  159.  beq Sm_maxi
  160.  subq.l #2,d0              ;string -1 if backward
  161.  rts
  162.